/*
 * @Author: 0x9DEFA478
 * @Date: 2025-07-19 15:16:15
 * @LastEditTime: 2025-09-13 15:28:28
 * @LastEditors: 0x9DEFA478
 * @Description: 
 * 
 */
#ifndef hTree_H_Tree_H_
#define hTree_H_Tree_H_
#ifdef __cplusplus
extern "C"{
#endif




#define vH_Tree_FindInsert_Result_InsertToLeft                    0
#define vH_Tree_FindInsert_Result_InsertToRight                   1
#define vH_Tree_FindInsert_Result_InsertToRoot                    2
#define vH_Tree_FindInsert_Result_Exist                           3




typedef struct sH_TreeNode H_TreeNode;

struct sH_TreeNode{
  H_TreeNode* Parent;
  H_TreeNode* Left;
  H_TreeNode* Right;
};


/**
 * @brief 查找值最小的节点
 * @param Root 要查找的树的根节点
 * @return 找到的节点
 */
H_TreeNode* H_Tree_FrontNode(H_TreeNode* Root);

/**
 * @brief 查找值最大的节点
 * @param Root 要查找的树的根节点
 * @return 找到的节点
 */
H_TreeNode* H_Tree_BackNode(H_TreeNode* Root);

/**
 * @brief 查找下一个节点
 * @param Node 当前节点
 * @return 下一个节点
 */
H_TreeNode* H_Tree_Forward(H_TreeNode* Node);

/**
 * @brief 查找上一个节点
 * @param Node 当前节点
 * @return 上一个节点
 */
H_TreeNode* H_Tree_Backward(H_TreeNode* Node);

/**
 * @brief 当要释放一个树的内存时, 该函数查找应该处理的第一个节点
 * @param Root 要查找的树的根节点
 * @return 找到的节点, 返回的节点的子节点至多只有一级(没有孙节点),有两种情况:
 *         1. 返回值是根节点, 这个时候需要释放根节点以及可能存在的左右节点
 *         2. 返回值不是根节点, 这个时候需要释放可能存在的左右节点，返回的节点传入H_Tree_NextFree查找下一个
 */
H_TreeNode* H_Tree_FirstFree(H_TreeNode* Root);

/**
 * @brief 当要释放一个树的内存时, 该函数查找应该处理的下一个节点
 *        注意: 该函数会将Node的左右子节点指针设置为NULL, 因为此时左右节点应当被释放
 * @param Node 当前节点
 * @return 返回值说明与H_Tree_FirstFree的相同
 */
H_TreeNode* H_Tree_NextFree(H_TreeNode* Node);




#ifdef __cplusplus
}
#endif
#endif //hTree_H_Tree_H_
